例6.3，10进制 VS 2进制
描述
    对于一个十进制数A，将A转换为二进制数，然后按位逆序排列，再转换为十进制数B，我们称B为A的二进制逆序数。     例如对于十进制数173，它的二进制形式为10101101，逆序排列得到10110101，其十进制数为181，181即为173的二进制逆序数。
输入描述：
    一个1000位(即10^999)以内的十进制数。
输出描述：
    输入的十进制数的二进制逆序数。
示例1
输入：
173

输出：
181


#include<bits/stdc++.h>
using namespace std;

string Divide(string str,int x){//字符串除法
    int reminder=0;//保存余数
    for(int i=0;i<str.size();i++){
        int current=reminder*10+str[i]-'0';
        str[i]=current/x+'0';
        reminder=current%x;
    }
    int pos=0;
    while(str[pos]=='0'){//寻找首个非0下标
        pos++;
    }
    return str.substr(pos);
}

string Multiple(string str,int x){//字符串乘法
    int carry=0;//保存进位
    for(int i=str.size()-1;i>=0;i--){
        int current=x*(str[i]-'0')+carry;
        str[i]=current%10+'0';
        carry=current/10;
    }
    if(carry!=0){//仍有进位
        str="1"+str;
    }
    return str;
}

string Add(string str,int x){//字符串加法
    int carry=x;
    for(int i=str.size()-1;i>=0;i--){
        int current=(str[i]-'0')+carry;
        str[i]=current%10+'0';
        carry=current/10;
    }
    if(carry!=0){//仍有进位
        str="1"+str;
    }
    return str;
}

int main(){
    string str;
    while(cin>>str){
        vector<int> number;
        while(str.size()!=0){
            int last=str[str.size()-1]-'0';//最低位的值
            number.push_back(last%2);//取模运算
            str=Divide(str,2);//整除
        }
        string answer="0";
        for(int i=0;i<number.size();++i){
            answer=Multiple(answer,2);//乘法运算
            answer=Add(answer,number[i]);//加法运算
        }
        cout<<answer<<endl;
    }
    return 0;
}
